using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GangTiJiaLi : MonoBehaviour
{

    private Rigidbody _rigidbody;

    // Start is called before the first frame update
    void Start()
    {
        #region 刚体自带添加力的方法
        // 获取当前校对对应的游戏对象上的刚体组件
        _rigidbody = this.GetComponent<Rigidbody>();

        // 相对于世界坐标系进行加力
        // Vector3.forward表示z轴正方向
        // 加力之后, 对象是否停止移动, 是有阻力决定的, 如果阻力为0, 则这个物体将一直停不下来
        // 如果你希望有阻力也希望对象一直动, 则在Update方法中已知加力即可.
        // _rigidbody.AddForce(Vector3.forward * 10);


        // 相对于本地坐标系进行加力
        // _rigidbody.AddRelativeForce(Vector3.forward * 10);
        // 如果先要在世界坐标中让对象相对于自己的面朝向移动, 下面这行代码的效果和上面代码的效果一样
        // _rigidbody.AddForce(this.transform.forward * 10);

        // 相对世界坐标系添加扭矩力, 使其旋转
        // _rigidbody.AddTorque(Vector3.up * 10);

        // 相对本地坐标系添加扭矩力, 使其旋转
        // _rigidbody.AddRelativeTorque(Vector3.up * 10);

        // 直接改变速度
        // 这个速度方向是相对于世界坐标系的
        // 一般很少直接改速度
        // _rigidbody.velocity = Vector3.forward * 5;

        // 模拟爆炸效果
        // 参数意义: 参数1->力的大小; 参数2->爆炸中心; 参数3->爆炸半径
        // 下面函数的意思是: 使当前对象受到以世界坐标中零点为中心, 发生100力度的爆炸, 爆炸半径是10
        // _rigidbody.AddExplosionForce(100, Vector3.zero, 10);
        #endregion

        #region 力的几种模式
        // 第二个参数就是制定加力模式
        // 由于4中计算方式的不同, 最终的移动速度就会不同
        // _rigidbody.AddForce(Vector3.forward * 10, ForceMode.Acceleration);

        // 动量定理: Ft = mv; (F:力 t:时间 m:质量 v:速度); 推导: v=Ft/m
        // 力的四种模式解释: 
        // - Acceleration: 给物体加一个持续的加速度, 忽略其质量; 动量公式中: 加一个Vector3.forward * 10的力则F=(0,0,10), 默认情况下t=0.02秒, 是物理帧的更新时间, 忽略质量影响m=1, 则v=10*0.02=0.2m/s, 每物理帧移动0.2m/s*0.02=0.004m
        // - Force: 给物体加一个持续的力, 与物体的质量有关; 动量公式中: 加一个Vector3.forward * 10的力则F=(0,0,10), 默认情况下t=0.02秒, 是物理帧的更新时间, 质量影响m=2, 则v=10*0.02/2=0.1m/s, 每物理帧移动0.1m/s*0.02=0.002m;;; 这种模式最接近真实
        // - Impulse: 给物体添加一个瞬间的力, 与物体的质量有关, 忽略时间(认为等于1); 动量公式中: 加一个Vector3.forward * 10的力则F=(0,0,10), t=1, 质量影响m=2, 则v=10*1/2=5m/s, 每物理帧移动5m/s*0.02=0.1m
        // - VelocityChange: 给物体加一个瞬时速度, 忽略质量; 动量公式中: 加一个Vector3.forward * 10的力则F=(0,0,10), t=1, m=1, 则v=10/1=10m/s, 每物理帧移动10m/s*0.02=0.2m

        #endregion


    }

    // Update is called once per frame
    void Update()
    {
        // _rigidbody.IsSleeping()方法用于判断刚体是否处于休眠状态; _rigidbody.WakeUp();方法则用于唤醒休眠的刚体
        // if (_rigidbody.IsSleeping())
        // {
        //     _rigidbody.WakeUp();
        // }
    }
}
